//
//  UserAccountViewModel.swift
//  weibo10
//
//  Created by 晁岳山 on 15/10/17.
//  Copyright © 2015年 晁岳山. All rights reserved.
//

import UIKit
//视图模型一般不继承任何类  model继承NSObject的原因是因为初始化方便可以使用KVC
//视图模型一般是处理逻辑业务  通常没有复杂的属性
class UserAccountViewModel {
    
    
    //定义单例  避免重复从沙盒加载 归档文件  提高效率，让token便于被访问到
    static let sharedUserViewMModel = UserAccountViewModel()
    
    //判断登录界面的状态
    //如果token存在  那么就显示首页  把未登录界面的状态改为true
    var login: Bool {
        return account?.access_token != nil && !isExpires
    }
    //从沙盒中解档数据
    //用户模型
    var account: UserAccount?
    private var path: String {
        var p = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        p = (p as NSString).stringByAppendingPathComponent("aaa.plist")
        return p
    }
    //判断账户是否过期
    private var isExpires: Bool {
        if account?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            
            return false
        }
        return true
    }
    //拿到没有过期的token
    var token: String? {
        if !isExpires {
            return account?.access_token
        }
        return nil
    }
    //用户头像url
    var avatarURL: NSURL {
        return NSURL(string: account?.avatar_large ?? "")!
    }
    //用户信息的保存路径
    private var accountPath: String {
        var path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        path = (path as NSString).stringByAppendingPathComponent("userInfo.plist")
        
        return path
    }
    //设置成私有的  为了使用单例  提高效率
    private init() {
       account =  NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? UserAccount
        if isExpires {
            print("当前用户已经过期")
            account = nil
        }
    }
}
//加载网络数据
extension UserAccountViewModel {
    func loadAccessToken(code: String, finished: (issucced: Bool) -> ()) {
        NetworkTools.sharedTools.loadAccessToken(code) { (result, error) -> () in
            if error != nil {
                print("出错了")
                finished(issucced: false)
                return
            }
            
            //字典转模型  转换成模型  加载网络个人数据
            //通过微博提供的访问个人信息借口以及拼接参数的形式  返回个人数据
            //这儿 as 后面为什么要用 ？
            self.account = UserAccount(dict: result as! [String: AnyObject])
            //记载数据
            self.loadUserInfo(self.account!, finished: finished)
            
        }
        
    }
    //通过token 网络加载用户的用户信息
    private func loadUserInfo(account: UserAccount, finished: (issucced: Bool) -> ()) {
        
        NetworkTools.sharedTools.loadUserInfo(account.uid!) { (result, error) -> () in
            if error != nil {
                print("个人数据加载错误")
                finished(issucced: false)
                return
            }
            print(result)
            guard let dict = result as? [String: AnyObject] else {
                print("格式有错误")
                finished(issucced: false)
                return
            }
            account.screen_name = dict["screen_name"] as? String
            account.avatar_large = dict["avatar_large"] as? String
           NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath)
            //完成成功地回调 告诉对方已经成功
            finished(issucced: true)
        }
    }

}